//想解决线程安全问题只有锁才可以解决，volatile关键字只能解决内存可见性的问题
//线程不安全
/*内存可见性：编译器可能对我们本写的代码进行优化，可能有些操作下，我们需要频繁的读取内存
* 但是读到的结果又是不变的，所以优化成只会读一次内存，支取从寄存器中读取，不再重复的读取内存
* ，此时修改内存中的变量计算机是感知不到的  此时多线程的代码就会产生了bug*/
class Counter {
    public int counter;
    public int get() {
        return counter;
    }
    public void add() {
        counter++;
    }
}
public class ThreadDemo12 {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();
        Object object = new Object();
        //搞两个线程，两个线程分别队这个counter进行自增 50000次
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (object) {//需要是对同一个对象进行加锁才能产生效果（）中就是一个锁对象
                    counter.add();
                }
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                synchronized (object) {
                    counter.add();
                }
            }
        });
        t1.start();
        t2.start();

        //等待两个线程执行结束，然后看结果
        t1.join();
        t2.join();

        System.out.println(counter.get());
    }
}
